package RapiWeb;

import RapiWeb.Evento.JF_Principal_Evento;
import RapiWeb.Objeto.Proyecto;
import Componentes.C_MenuPestaña;
import Utilidades.Archivo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/**
 * @author Luis Antonio Lara Capetillo Fecha: 11/08/12
 *
 * Descripcion: Clase pricipal donde se encuentran los componenetes para
 * pantalla principal de la aplicacion
 *
 * @version 1.0
 */
public class JF_Principal extends JFrame {

    private String str_Archivo[];
    private String str_Edicion[];
    private String str_Configuraciones[];
    private String str_Ayuda[];
    private String str_Master[];
    private String str_Tabla[];
    private String str_CSS[];
    private String str_Cascaron[];
    private String str_Capas[];
    private String str_NomProyecto;
    private JPanel p_Principal;
    private JPanel p_Componente;
    private JP_Tabla p_Estructura;
    private Proyecto proyecto;
    private JP_BaseDatos p_BD;   //panel de base de datos
    private int int_Documento;
    final int int_Web = 0;
    final int int_Componente = 1;
    private C_MenuPestaña m_Pestañas;
    private String str_DirecRaiz;
    private String str_DirecCapaReporte;
    private String str_DirecCapaDatos;
    private String str_DirecCapaNegocios;
    private String str_DirecCapaEntidad;
    private String str_DirecProcedimientos;
    private String str_DirecTablas;
    private String str_DirecPaquetes;
    private String str_DirecMaster;
    private String str_DirecCSS;
    private String str_DirecCascaron;
    private String str_DirecCapas; //donde se guarda los cascarones de las capas
    private JP_Web p_web;
    private JP_NuevoProyecto p_Nuevo;

    public JF_Principal() {
        super("Bienvenido a RapiWeb");
        setSize(800, 600);
        setLocationRelativeTo(null);
//        getContentPane().setVisible(false);
        addMenu();
        addEventosMenu();
        setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/imagenes/icono.png")));
        setVisible(true);
    }

    /* ***********************************************************************
     ***               Sección de Setters y Getters                        ***
     *************************************************************************/
    /**
     *
     * @return str_NomProyecto
     */
    public String getStr_NomProyecto() {
        return str_NomProyecto;
    }

    /**
     *
     * @param str_NomProyecto
     */
    public void setStr_NomProyecto(String str_NomProyecto) {
        this.str_NomProyecto = str_NomProyecto;
    }

    /**
     *
     * @return p_Estructura
     */
    public JP_Tabla getP_Estructura() {
        return p_Estructura;
    }

    public void setP_Estructura(JP_Tabla p_Estructura) {
        this.p_Estructura = p_Estructura;
    }

    public Proyecto getProyecto() {
        return proyecto;
    }

    public void setProyecto(Proyecto proyecto) {
        this.proyecto = proyecto;
    }

    public int getInt_Documento() {
        return int_Documento;
    }

    public void setInt_Documento(int int_Documento) {
        this.int_Documento = int_Documento;
    }

    public int getInt_Web() {
        return int_Web;
    }

    public int getInt_Componente() {
        return int_Componente;
    }

    public JPanel getP_Componente() {
        return p_Componente;
    }

    public void setP_Componente(JPanel p_Componente) {
        this.p_Componente = p_Componente;
    }

    public JP_BaseDatos getP_BD() {
        return p_BD;
    }

    public void setP_BD(JP_BaseDatos p_BD) {
        this.p_BD = p_BD;
    }

    public String getStr_DirecCapaReporte() {
        return str_DirecCapaReporte;
    }

    public String getStr_DirecCapaDatos() {
        return str_DirecCapaDatos;
    }

    public String getStr_DirecCapaNegocios() {
        return str_DirecCapaNegocios;
    }

    public String getStr_DirecCapaEntidad() {
        return str_DirecCapaEntidad;
    }

    public String getStr_DirecProcedimientos() {
        return str_DirecProcedimientos;
    }

    public String getStr_DirecTablas() {
        return str_DirecTablas;
    }

    public String[] getStr_Tabla() {
        return str_Tabla;
    }

    public String getStr_DirecPaquetes() {
        return str_DirecPaquetes;
    }

    public String[] getStr_Master() {
        return str_Master;
    }

    public JP_Web getP_web() {
        return p_web;
    }

    public JP_NuevoProyecto getP_Nuevo() {
        return p_Nuevo;
    }

    public String getStr_DirecMaster() {
        return str_DirecMaster;
    }

    public String getStr_DirecCSS() {
        return str_DirecCSS;
    }

    public String getStr_DirecCascaron() {
        return str_DirecCascaron;
    }

    public C_MenuPestaña getM_Pestañas() {
        return m_Pestañas;
    }

    public String[] getStr_CSS() {
        return str_CSS;
    }

    public String getStr_DirecRaiz() {
        return str_DirecRaiz;
    }

    public String[] getStr_Cascaron() {
        return str_Cascaron;
    }

    public String getStr_DirecCapas() {
        return str_DirecCapas;
    }

    public String[] getStr_Capas() {
        return str_Capas;
    }

    /* ************************************************************************
     ***                 Seccion de Metodos                                 ***
     **************************************************************************/
    /**
     * Metodo para inicializar los datos de la clase JF_Principal
     */
    public void m_InicializarDatos() {

        Archivo archi = new Archivo();
        str_NomProyecto = proyecto.getStr_NomProyecto();
        archi.m_CrearCarpeta(str_NomProyecto + "/MasterPage");
        archi.m_CrearCarpeta(str_NomProyecto + "/CSS");
        archi.m_CrearCarpeta(str_NomProyecto + "/Cascaron");
        archi.m_CrearCarpeta(str_NomProyecto + "/Capas");

        File carpeta;
        carpeta = new File(str_NomProyecto + "/MasterPage");
        str_Master = carpeta.list();
        carpeta = new File(str_NomProyecto + "/Tablas");
        str_Tabla = carpeta.list();
        carpeta = new File(str_NomProyecto + "/CSS");
        str_CSS = carpeta.list();
        carpeta = new File(str_NomProyecto + "/Cascaron");
        str_Cascaron = carpeta.list();
        carpeta = new File(str_NomProyecto + "/Capas");
        str_Capas = carpeta.list();

        //se asignan las direcciones donde se guardaran los archivos creados
        str_DirecRaiz = str_NomProyecto + "/";
        str_DirecCapaReporte = str_NomProyecto + "/Paginas/";
        str_DirecCapaDatos = str_NomProyecto + "/Codigo/CapaDatos";
        str_DirecCapaNegocios = str_NomProyecto + "/Codigo/CapaNegocios";
        str_DirecCapaEntidad = str_NomProyecto + "/Codigo/CapaEntidad/";
        str_DirecProcedimientos = str_NomProyecto + "/Codigo/Procedimientos/";
        str_DirecTablas = str_NomProyecto + "/Tablas/";
        str_DirecPaquetes = str_NomProyecto + "/Codigo/PaquetesSql/";
        str_DirecMaster = str_NomProyecto + "/MasterPage/";
        str_DirecCSS = str_NomProyecto + "/CSS/";
        str_DirecCascaron = str_NomProyecto + "/Cascaron/";
        str_DirecCapas = str_NomProyecto + "/Capas/";

        archi.m_CrearArchivo(str_DirecCapas + "Datos."+proyecto.getStr_Lenguaje());
        archi.m_CrearArchivo(str_DirecCapas + "Entidad."+proyecto.getStr_Lenguaje());
        archi.m_CrearArchivo(str_DirecCapas + "Negocios."+proyecto.getStr_Lenguaje());
    }

    private void addMenu() {
        String str_Titulos[] = new String[]{"Archivo", "Edicion", "Configuraciones", "Ayuda"};
        str_Archivo = new String[]{"Nuevo Proyecto", "Abrir Proyecto", "Guardar", "Salir"};
        str_Edicion = new String[]{"Nueva Tabla", "Nueva PaginaWeb", "Nuevo Control", "Paquete SQL", "Procedimiento SQL"};
        str_Configuraciones = new String[]{"General", "Agregar MasterPages", "Cascaron", "Agregar Componete",
            "Agregar CSS", "Capas"};
        str_Ayuda = new String[]{"Acerca de RapiWeb", "Avanzado"};

        ImageIcon[] ima_Archivo = new ImageIcon[]{new ImageIcon(getClass().getResource("/imagenes/nuevo.png")),
            new ImageIcon(getClass().getResource("/imagenes/abrir.png")), new ImageIcon(getClass().getResource("/imagenes/guardar.png")),
            new ImageIcon(getClass().getResource("/imagenes/salir.png"))};
        ImageIcon[] ima_Edicion = new ImageIcon[]{new ImageIcon(getClass().getResource("/imagenes/tabla.png")),
            new ImageIcon(getClass().getResource("/imagenes/web.png")), new ImageIcon(getClass().getResource("/imagenes/control.png")),
            new ImageIcon(getClass().getResource("/imagenes/paquete.png")), new ImageIcon(getClass().getResource("/imagenes/procedimiento.png"))};
        ImageIcon[] ima_Configuraciones = new ImageIcon[]{new ImageIcon(getClass().getResource("/imagenes/general.png")),
            new ImageIcon(getClass().getResource("/imagenes/master.png")), new ImageIcon(getClass().getResource("/imagenes/cascaron.png")),
            new ImageIcon(getClass().getResource("/imagenes/componente.png")), new ImageIcon(getClass().getResource("/imagenes/css.png")),
            new ImageIcon(getClass().getResource("/imagenes/capas.png"))};
        ImageIcon[] ima_Ayuda = new ImageIcon[]{new ImageIcon(getClass().getResource("/imagenes/acerca.png")),
            new ImageIcon(getClass().getResource("/imagenes/ayuda.png"))};

        m_Pestañas = new C_MenuPestaña(str_Titulos);
        m_Pestañas.addOpcionesMenu(0, str_Archivo, ima_Archivo);
        m_Pestañas.addOpcionesMenu(1, str_Edicion, ima_Edicion);
        m_Pestañas.addOpcionesMenu(2, str_Configuraciones, ima_Configuraciones);
        m_Pestañas.addOpcionesMenu(3, str_Ayuda, ima_Ayuda);

//        m_Pestañas.addOpcionesMenu(0, str_Archivo);
//        m_Pestañas.addOpcionesMenu(1, str_Edicion);
//        m_Pestañas.addOpcionesMenu(2, str_Configuraciones);
//        m_Pestañas.addOpcionesMenu(3, str_Ayuda);
        add(m_Pestañas, "North");
    }

    /**
     * Metodo para añadir el panel principal de la clase
     *
     */
    public void addComponentes() {
        this.setTitle("Proyecto activo: " + str_NomProyecto);
        p_Principal = new JPanel();
        p_Principal.setBackground(Color.DARK_GRAY);
        p_Principal.setLayout(new BorderLayout());

        JLabel titulo = new JLabel(str_NomProyecto);
        titulo.setFont(new Font("Arial", 1, 60));
        titulo.setForeground(Color.orange);

        p_Principal.add(titulo, "South");
        add(p_Principal, "Center");
    }

    /**
     * Metood para eliminar paneles
     */
    public void m_EliminarPanles() {
        p_Principal.removeAll();
    }

    /**
     * Metodo para crear un proyecto nuevo
     */
    public void m_PanelNuevoProyecto() {
        p_Principal.setVisible(false);
        p_Nuevo = new JP_NuevoProyecto(JF_Principal.this);
        p_Principal.add(p_Nuevo, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para mostrar el panel para crea una tabla nueva
     */
    public void m_PanelBaseDatos() {
        p_Principal.setVisible(false);
        p_BD = new JP_BaseDatos(JF_Principal.this);
        p_Principal.add(p_BD, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodoo para mostrar el Panel para crear una pagina web nueva
     */
    public void m_PanelWeb() {
        p_Principal.setVisible(false);
        p_web = new JP_Web(JF_Principal.this, JP_Web.Web);
        p_Principal.add(p_web, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodoo para mostrar el Panel para crear un componente nuevo
     */
    public void m_PanelComponente() {
        p_Principal.setVisible(false);
        p_web = new JP_Web(JF_Principal.this, JP_Web.Control);
        p_Principal.add(p_web, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para agregar el panel para crear un paquete nuevo
     */
    public void m_PanelPaquete() {
        p_Principal.setVisible(false);
        JP_Paquete p_Paquete = new JP_Paquete(JF_Principal.this);
        p_Principal.add(p_Paquete, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para crear el panel de masterPage
     */
    public void m_PanelMaster() {
        p_Principal.setVisible(false);
        JP_Master p_Master = new JP_Master(JF_Principal.this);
        p_Principal.add(p_Master, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para crear el panel de CSS
     */
    public void m_PanelCSS() {
        p_Principal.setVisible(false);
        JP_CSS p_CSS = new JP_CSS(JF_Principal.this);
        p_Principal.add(p_CSS, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para crear el panel de Cascaron
     */
    public void m_PanelCascaron() {
        p_Principal.setVisible(false);
        JP_Cascaron p_Cascaron = new JP_Cascaron(JF_Principal.this);
        p_Principal.add(p_Cascaron, "Center");
        p_Principal.setVisible(true);
    }

    /**
     * Metodo para crear el panel de Capas
     */
    public void m_PanelCapas() {
        p_Principal.setVisible(false);
        JP_Capa p_Capas = new JP_Capa(JF_Principal.this);
        p_Principal.add(p_Capas, "Center");
        p_Principal.setVisible(true);
    }

    public void m_AsignarProyecto(String str_Archivo) {
        Archivo archi = new Archivo();
        try {
            proyecto = new Proyecto();
            archi.m_LeerLineas(str_Archivo, 34, "=");
            proyecto.setStr_NomProyecto(archi.dameLineaP2(0));
            proyecto.setStr_Autor(archi.dameLineaP2(1));
            proyecto.setStr_Lenguaje(archi.dameLineaP2(2));
            proyecto.setStr_Gestor(archi.dameLineaP2(3));
            proyecto.setStr_ClasePresentacion(archi.dameLineaP2(4));
            proyecto.setStr_ClaseNegocio(archi.dameLineaP2(5));
            proyecto.setStr_ClaseDatos(archi.dameLineaP2(6));
            proyecto.setStr_Componentes(archi.dameLineaP2(7));
            proyecto.setStr_Property(archi.dameLineaP2(8));
            proyecto.setStr_Funciones(archi.dameLineaP2(9));
            proyecto.setStr_Eventos(archi.dameLineaP2(10));
            proyecto.setStr_Exception(archi.dameLineaP2(11));
            proyecto.setStr_VarGeneral(archi.dameLineaP2(12));
            proyecto.setStr_VarEntero(archi.dameLineaP2(13));
            proyecto.setStr_VarString(archi.dameLineaP2(14));
            proyecto.setStr_VarDouble(archi.dameLineaP2(15));
            proyecto.setStr_VarFloat(archi.dameLineaP2(16));
            proyecto.setStr_VarFecha(archi.dameLineaP2(17));
            proyecto.setStr_Label(archi.dameLineaP2(18));
            proyecto.setStr_Button(archi.dameLineaP2(19));
            proyecto.setStr_TextField(archi.dameLineaP2(20));
            proyecto.setStr_ComboBox(archi.dameLineaP2(21));
            proyecto.setStr_CheckBox(archi.dameLineaP2(22));
            proyecto.setStr_GridView(archi.dameLineaP2(23));
            proyecto.setStr_ListBox(archi.dameLineaP2(24));
            proyecto.setStr_FuncionSQL(archi.dameLineaP2(25));
            proyecto.setStr_ProcedimientoSQL(archi.dameLineaP2(26));
            proyecto.setStr_CursorSQL(archi.dameLineaP2(27));
            proyecto.setStr_VariableSQL(archi.dameLineaP2(28));
            proyecto.setStr_ParametrosSQL(archi.dameLineaP2(29));
            proyecto.setStr_RegistroSQL(archi.dameLineaP2(30));
            proyecto.setStr_ConstanteSQL(archi.dameLineaP2(31));
            proyecto.setStr_ExceptionSQL(archi.dameLineaP2(32));
            proyecto.setStr_Paquete(archi.dameLineaP2(33));

            setVisible(false);
            setProyecto(proyecto);
            m_InicializarDatos();
            addComponentes();
            setVisible(true);
//        System.out.println(archi.dameContenido());
            System.out.println(proyecto.m_DatosProyecto());
        } catch (Exception ex) {
            System.out.println(ex.getMessage() + " : " + archi.dameError());
        }

    }

    /**
     * Metodo para aisnar los eventos de la clase
     */
    private void addEventosMenu() {
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        for (int i = 0; i < str_Archivo.length; i++) {
            m_Pestañas.getMenu(0).getOpcion(i).addActionListener(new JF_Principal_Evento(JF_Principal.this, i));
        }
        for (int i = 0; i < str_Edicion.length; i++) {
            m_Pestañas.getMenu(1).getOpcion(i).addActionListener(new JF_Principal_Evento(JF_Principal.this, i + 10));
        }
        for (int i = 0; i < str_Configuraciones.length; i++) {
            m_Pestañas.getMenu(2).getOpcion(i).addActionListener(new JF_Principal_Evento(JF_Principal.this, i + 20));
        }
        for (int i = 0; i < str_Ayuda.length; i++) {
            m_Pestañas.getMenu(3).getOpcion(i).addActionListener(new JF_Principal_Evento(JF_Principal.this, i + 30));
        }
    }
}
